//
// Created by kidon on 20-9-4.
//

#ifndef TC_MEDIA_VIDEO_ENCODER_H
#define TC_MEDIA_VIDEO_ENCODER_H

#include <stdint.h>

#include "codec_types.h"
#include "pixel_format_types.h"
#include "image_crop_types.h"

/**
 * 视频编码器结构体，包含编码时所需要的各种参数和变量
 */
typedef struct TcVideoEncoder {

    /** 编码类型 */
    enum CodecType codec_type;

    /** 输入图像宽度 */
    int src_width;

    /** 输入图像高度 */
    int src_height;

    /** 输入图像格式 */
    enum PixelFormatType src_pix_fmt_type;

    /*** 输出图像宽度 */
    int dest_width;

    /*** 输出图像高度 */
    int dest_height;

    /*** 图像裁剪类型 */
    enum ImageCropTypes crop_type;

    /** 帧率 */
    int fps;

    /** 码率 */
    int bit_rate;

    /** 编码帧序号 */
    int encode_frame_index;

    /**
     * 额外数据指针，指向用于储存编码使用到的第三方库的参数和变量的结构体。
     */
    void *extra;

} TcVideoEncoder;

/**
 * 初始化视频编码器
 *
 * @param encoder           编码器结构体指针地址
 * @param codec_type        编码类型
 * @param src_width         源图像宽度
 * @param src_height        源图像高度
 * @param src_pix_fmt_type  源图像格式
 * @param dest_width        输出图像宽度
 * @param dest_height       输出图像高度
 * @param crop_type         裁剪类型
 * @param fps               帧率
 * @param bit_rate          码率
 * @return                  状态码
 */
int video_encoder_prepare(
        TcVideoEncoder **encoder,
        enum CodecType codec_type,
        int src_width,
        int src_height,
        enum PixelFormatType src_pix_fmt_type,
        int dest_width,
        int dest_height,
        enum ImageCropTypes crop_type,
        int fps,
        int bit_rate
);

/**
 * 将原始视频数据写入编码器
 *
 * @param encoder   编码器结构体指针
 * @param data      输入数据数组
 * @param offset    数组开始位置
 * @param len       数据长度
 * @return          状态码
 */
int video_encoder_write_frame(TcVideoEncoder *encoder, const uint8_t *data, int offset, int len);

/**
 * 读取编码后的视频数据
 *
 * @param encoder   编码器结构体指针
 * @param data      接收数据的数组
 * @param offset    数组开始位置
 * @return          状态码
 */
int video_encoder_read_frame(TcVideoEncoder *encoder, uint8_t *data, int offset);

/**
 * 排空视频编码器数据
 *
 * @param encoder   编码器结构体指针
 * @return          状态码
 */
int video_encoder_flush(TcVideoEncoder *encoder);

/**
 * 释放视频编码器
 *
 * @param encoder   编码器结构体指针地址
 * @return          状态码
 */
int video_encoder_release(TcVideoEncoder **encoder);

#endif //TC_MEDIA_VIDEO_ENCODER_H
